-
IEEE浮点数的浮点表示
IEEE浮点数表示形如的数
在位排布上的顺序是符号位 -> 阶码(指数)位 -> 尾数(基数)位
根据exp位的不同,可以分为如下情况:
-
规格化的
即exp位不全为0或全为1,此时exp被解释为无符号整数,
而阶码,其中,
而尾数,frac是二进制数的小数部分表示
在这里规格化数通过隐含一个 1 来最大化尾数的有效位数,从而提高了精度
-
非规格化的
即exp位全为0,此时数字会被特殊处理,
而阶码****,与规格化的值相同
而尾数****,frac同样是小数部分表示
通过Bias的方法,指数位可以用无符号整数表达,这方便计算机处理以及比较不同浮点数
通过非规格化数的特殊处理,IEEE浮点数可以更精确地表示接近0的小数,并与规格化数平滑转换
-
特殊值
当exp位全为1时,且frac位全为0时,整体表示正/负无穷大,即超出表达范围的结果
当frac位不全为0时,此时视作错误NaN,代表无效或无法处理的值
实际上,IEEE浮点数可表示的值并不是连续的,其在靠近0处更稠密、更精确,而远离0处更稀疏
-
-
浮点数的舍入
当使用精度有限的浮点数表达实数值时,可能需要进行舍入,舍入包括:
- 四舍五入,这是IEEE规定的默认舍入模式,可以尽量减少累计误差
- 向上舍入,这时表达值有明确的下界,即
- 向下舍入,这时表达值有明确的上界,即
- 向零舍入,此时对于负数与非负数,表达值分别有明确的下界和上界,即
- 向偶数舍入,此时没有明确的上下界,但是避免了舍入后数的均值偏离原数据的均值
-
浮点数的运算
-
浮点运算并不具有结合性,运算结果可能会受到顺序的影响,因为运算中可能产生溢出或精度丢失
同样的,浮点乘法并不具有可结合性和分配性
-
当浮点数和整数之间发生类型转换时,可能会有如下情况
- int -> float,通常不会产生溢出,但是可能发生舍入
- int -> double 或 float -> double,此时数值会被完整保留
- double -> float,可能发生精度丢失,若超出范围会溢出为无穷大
- float -> int 或 double -> int,在C语言中,最终值会截断,即向零舍入
-